perm filename BLOCK.SAI[PUB,TES] blob
sn#195731 filedate 1976-01-28 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGOF("BLOCK")
C00004 00003 PUBLIC SIMPLE PROCEDURE BLOCK! $"#
C00005 00004 PUBLIC RECURSIVE PROCEDURE BEGINBLOCK(BOOLEAN MIDPGPH INTEGER ECASE STRING NAME) $"#
C00007 00005 PUBLIC SIMPLE PROCEDURE ENDANY(BOOLEAN CHECK) $"#
C00009 00006 PUBLIC RECURSIVE BOOLEAN PROCEDURE ENDBLOCK $"#
C00016 00007 PUBLIC RECURSIVE PROCEDURE TOEND $"#
C00017 00008 FINISHED
C00018 ENDMK
C⊗;
BEGOF("BLOCK")
COMMENT
Block structure is implemented by various methods. The principle
data structure is ISTK which is an integer stack of declaration
records, each linked to the record below. An associated data
structure is SSTK, which is a string stack whose records are
referenced from corresponding entries in ISTK.
At block BEGIN, the mode-state of PUB is BLockTransferred onto ISTK
in a MODETYPE record. Each declaration in the block causes another
record to be stacked on top. At block END, records are peeled off
top-down, usually with the side effect of resetting global
parameters. Finally, the MODETYPE record is unstacked, and its
contents BLockTransferred back to the mode-state.
;
PROCEDURES
PUBLIC SIMPLE PROCEDURE BLOCK! ;$"#
BEGIN "BLOCK!"
ENDCASE ← STARTS ← 0 ;
BLNMS ← -1 ;
IXEND ← LDB(IXN(<SYMNUM("END")>)) ;
END "BLOCK!" ;
PUBLIC RECURSIVE PROCEDURE BEGINBLOCK(BOOLEAN MIDPGPH; INTEGER ECASE ; STRING NAME) ;$"#
BEGIN "BEGINBLOCK"
INTEGER MIX, I, X ;
IF ECASE = 0 THEN STARTS ← STARTS + 1 comment START...END ;
ELSE IF ECASE=-1 THEN ENDCASE←1 comment, ONCE merging with BEGIN ;
ELSE BEGIN "NOT CLUMP"
I←ENDCASE; ENDCASE←0; DBREAK; ENDCASE←I; RKJ: 7/15/74;
DEPTH ← DEPTH + 1 ; MIX ← PUSHI(MODEWDS, MODETYPE) ;
ARRBLT(ISTK[MIX-MODEWDS], BREAKM, MODEWDS) ;
PUSHI(TABLIMIT+1, TABTYPE) ; I ← 0 ;
DO ISTK[MIX←MIX+1] ← X ← TABSORT[I←I+1] UNTIL X>TWO(32) ;
ISTK[MIX+1] ← ISTK[IHED] ; OLDIHED ← IHED;TES 11/15/73; IHED ← MIX + 1 ;
IF MIDPGPH THEN
BEGIN "SAVE FILL PARAMS"
X ← MIDWDS + 1 ; PUSHI(X, MIDTYPE) ;
ILBF ← CVASC(LBF) ; ARRBLT(ISTK[IHED-X], THISTYPE, X-1) ;
ISTK[IHED-1]←PUSHS(1, THISWD) ; NOPGPH ← TRUE ; PLBL←BRKPLBL←-TWO(13) ;
END "SAVE FILL PARAMS" ;
ENDCASE ← ECASE ; STARTS ← 0 ;
END "NOT CLUMP" ;
IF BLNMS=MAXBLNMS THEN WARN(NULL, "Deep block nest/possibly infinite recursion");
RKJ: 5-10-74 - added CAPITALIZE below ;
IF NAME NEQ ALTMODE THEN BLKNAMES[BLNMS←BLNMS+1] ← CAPITALIZE(NAME) ; comment not for ONCE! ;
END "BEGINBLOCK" ;
PUBLIC SIMPLE PROCEDURE ENDANY(BOOLEAN CHECK) ;$"#
BEGIN "ENDANY"
STRING BLOCKNAME ;
BLOCKNAME ← IF BLNMS<0 THEN "!MISSING!" ELSE BLKNAMES[BLNMS] ;
BLNMS ← (BLNMS MAX 0) - 1 ;
IF CHECK AND THATISCON THEN
BEGIN
PASS ;
LOPP(THISWD) ;
RKJ: 5-10-74 - added CAPITALIZE below ;
IF NOT EQU(CAPITALIZE(THISWD),BLOCKNAME) THEN WARN("Mismatched BEGIN-END",<"BEGIN """&BLOCKNAME&""" but END """&THISWD&"""">) ;
END
ELSE IF FULSTR(BLOCKNAME) THEN WARN("Mismatched BEGIN-END",<"BEGIN """&BLOCKNAME&""" but END <blank>">) ;
END "ENDANY" ;
PUBLIC RECURSIVE PROCEDURE ENDBEGIN ;$"#
BEGIN ENDANY(TRUE) ; IF ENDBLOCK THEN WARN("=","Missed END in Response|Footnote") ELSE PASS END ;
PUBLIC RECURSIVE PROCEDURE ENDONCE ;$"#
IF ENDBLOCK THEN WARN("=","Missing END in Response|Footnote") ELSE ENDBEGIN ;
PUBLIC RECURSIVE PROCEDURE ENDRESP ;$"#
BEGIN ENDANY(TRUE) ; PASS ; IF ENDBLOCK THEN MYEND←TRUE ELSE WARN("=","Extra END") ; END ;
PUBLIC RECURSIVE PROCEDURE ENDSTART ;$"#
BEGIN ENDANY(TRUE) ; STARTS ← STARTS - 1 ; PASS ; END ;
PUBLIC RECURSIVE BOOLEAN PROCEDURE ENDBLOCK ;$"#
IF BLNMS<0 AND LAST>2 THEN BEGIN WARN("=","Extra END ignored"); BLNMS←0; RETURN(FALSE) END ELSE
BEGIN "ENDBLOCK"
INTEGER TYP, OLD, MIX, I, X, L1, L2, PASSED, NARROWED ; STRING S ;
I←ENDCASE; ENDCASE←0; DBREAK; ENDCASE←I; RKJ: 7/11/74;
NARROWED ← PASSED ← FALSE ;
DO COMMENT Skip through ISTK restoring former state and terminating INDENT etc. ;
BEGIN "ISTK ENTRY"
TYP ← IXTYPE(IHED) ;
CASE TYP - 12 OF
BEGIN COMMENT BY TYPE ;
[AREATYPE-12] IF NOT DISD(IHED) THEN BEGIN CLOSEAREA(IHED,TRUE) ; NUMBER[LDB(BIXNUM(IHED))]←0 END;
[COUNTERTYPE-12] IF NOT DISD(IHED) THEN BEGIN CLOSECOUNTER(IHED,TRUE) ; NUMBER[LDB(BIXNUM(IHED))]←0 END;
[MACROTYPE-12] BEGIN SSTK[BODY(IHED)]←NULL;TES 11/15/73; NUMBER[LDB(BIXNUM(IHED))] ← 0 END;
[RESPTYPE-12] BEGIN "POP RESP"
X ← CLUE(IHED) ; I ← VARIETY(IHED) ; OLD ← OLD!RESP(IHED) ;
SSTK[BODY(IHED)] ← NULL ; TES 11/15/73 ;
CASE I-1 MIN 2 OF
BEGIN "BY VARIETY"
COMMENT 0 ... Phrase ;
TES 11/15/73 removed this case ;
COMMENT 1 ... Inset ;
IF FINDINSET(X) THEN
IF NOT OLD THEN LLSKIP(LEADRESPS, <NEXT!RESP>)
ELSE BEGIN
NEXT!RESP(OLD) ← LLPOST ;
IF LLPREV<0 THEN LEADRESPS←OLD ELSE NEXT!RESP(LLPREV) ← OLD ;
END ;
COMMENT 2 ... Signal ;
BEGIN "SIGNAL"
X ← SIGNAL(IHED) ; L1 ← X LSH -29 ;
IF FINDSIGNAL(X) THEN
IF NOT OLD THEN BEGIN
S ← NULL ;
WHILE FULSTR(SIG!BRC) AND (L2←LOP(SIG!BRC)) NEQ L1 DO S←S&L2;
SIG!BRC ← S & SIG!BRC ;
LLSKIP(<SIGNALD[L1]>, <NEXT!RESP>) ; COMMENT JAN 8 1973 ;
END
ELSE BEGIN
NEXT!RESP(OLD) ← LLPOST ;
IF LLPREV<0 THEN SIGNALD[L1]←OLD ELSE NEXT!RESP(LLPREV) ← OLD ;
END ;
END "SIGNAL" ;
COMMENT 3, 4 ... After, Before ;
IF FINDTRAN(X,I) THEN
IF NOT OLD THEN LLSKIP(WAITRESP, <NEXT!RESP>)
ELSE BEGIN
NEXT!RESP(OLD) ← LLPOST ;
IF LLPREV<0 THEN WAITRESP←OLD ELSE NEXT!RESP(LLPREV) ← OLD ;
END ;
END "BY VARIETY" ;
END "POP RESP" ;
[MARGTYPE-12] IF OLD←AREAX(IHED) THEN
BEGIN NARROWED ← TRUE ; MARGINS(OLD) ← X ← OLD!MARGX(IHED) ;
LMARG ← IF X THEN LMARGX(X) ELSE 0 ;
RMARG ← IF X THEN RMARGX(X) ELSE COLWID(OLD) ;
END ;
[TURNTYPE-12] IF (OLD←ISTK[IHED-1]) GEQ 0 THEN TURN(OLD LSH -7 , OLD LAND '177 , 1 ) ;
[MODETYPE-12] BEGIN
I ← GROUPM ; OLD ← AREAIXM ; X ← GLINEM ; TES 11/15/73 REMOVED J ← THISFONT ;
ARRBLT(BREAKM, ISTK[IHED-MODEWDS], MODEWDS) ; OLD SWAP AREAIXM ;
TES 11/14/73 removed IF J NEQ THISFONT THEN SELECTFONT(THISFONT);
IF I THEN IF NOT GROUPM THEN DAPART
ELSE IF GLINEM=0 THEN GLINEM ← X ;
COMMENT ADDED THIS ↑ LINE 2/20/73 ;
IF NOT PASSED AND NARROWED THEN NOPGPH ← 1 ;
JUSTIFY ← FILL AND ADJUST OR JUSTJUST ;
PLACE(IF OLD THEN OLD ELSE IXTEXT);
COMPMAXIMS ;
END ;
[NUMTYPE-12] BEGIN
OLD ← OLD!NUMBER(IHED) ;
NUMBER[X ← LDB(SYMBOLWD(OLD))] ← OLD ;
IF X = SYMPAGE THEN BEGIN IXPAGE ← LDB(IXN(X)) ; PATPAGE ← PATT!STRS(IXPAGE) END
ELSE IF X = SYMTEXT THEN IXTEXT ← LDB(IXN(X)) ;
END ;
[TABTYPE-12] BEGIN
MIX ← IXOLD(IHED) ; I ← 0 ;
DO TABSORT[I←I+1] ← X ← ISTK[MIX←MIX+1] UNTIL X>TWO(32) ;
END ;
[MIDTYPE-12] BEGIN
IF LENGTH(INPUTSTR)>1 THEN WARN("Imbalance","Unbalanced Response|Footnote! "&SOMEINPUT) ;
THISWD←SSTK[ISTK[IHED-1]] ; OLD←PLBL ;
ARRBLT(THISTYPE,ISTK[X←IXOLD(IHED)+1],IHED-X-1) ;
LBF ← CVSTR(ILBF) ;
WHILE FULSTR(LBF) AND LBF[∞ FOR 1]=0 DO LBF←LBF[1 TO ∞-1] ;
IF OLD NEQ -TWO(13) THEN
BEGIN COMMENT UNDEFINED PAGE LABELS -- PASS UP TO OUTER BLOCK ;
X ← OLD ;
DO BEGIN L1←X ; X←IF X<0 THEN NUMBER[-X] ELSE ITBL[X] END UNTIL X=-TWO(13) ;
IF L1<0 THEN NUMBER[-L1] ← PLBL ELSE ITBL[L1] ← PLBL ;
PLBL ← OLD ;
END ;
INPUTSTR←NULL ; IF THATISFULL THEN RDENTITY ELSE INPUTSTR←SWICHBACK ; PASSED←TRUE ;
END ;
[FONTYPE-12] IF (OLD←AREAX(IHED)) AND XCRIBL THEN TES 11/15/73 ;
BEGIN
FONTSIX(OLD) ← OUTERX(IHED) ;
TFONT(OLD) ← THISFONTX(IHED) ;
OFONT(OLD) ← OLDFONTX(IHED) ;
IF OLD = AREAIXM THEN
BEGIN
THISFONT ← TFONT(OLD) ;
OLDFONT ← OFONT(OLD) ;
IDASSIGN(FNTFIL[THISFONT], CW) ;
END ;
END ;
[PITYPE-12] PICHAR[PIKEY(IHED)] ← SSTK[PIVAL(IHED)] TES 11/29/73;
END ; COMMENT BY TYPE ;
IHED ← IXOLD(IHED) ;
END "ISTK ENTRY"
UNTIL TYP=MODETYPE OR IHED=0 ;
DEPTH ← DEPTH - 1 ;
RETURN(PASSED) ;
END "ENDBLOCK" ;
PUBLIC RECURSIVE PROCEDURE TOEND ;$"#
BEGIN "TOEND"
BOOLEAN VALID ;
VALID ← TRUE ;
DO VALID ← CHUNK(VALID) UNTIL MYEND ;
MYEND ← FALSE ;
END "TOEND" ;
FINISHED
ENDOF("BLOCK")